package main

func main() {
	letterCombinations("23")
}

//给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
//
// 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。
//
//
//
//
//
// 示例 1：
//
//
//输入：digits = "23"
//输出：["ad","ae","af","bd","be","bf","cd","ce","cf"]
//
//
// 示例 2：
//
//
//输入：digits = ""
//输出：[]
//
//
// 示例 3：
//
//
//输入：digits = "2"
//输出：["a","b","c"]
//
//
//
//
// 提示：
//
//
// 0 <= digits.length <= 4
// digits[i] 是范围 ['2', '9'] 的一个数字。
//
// Related Topics 哈希表 字符串 回溯 👍 1703 👎 0

// 2 abc
// 3 def
// 4 ghi
// 5 jkl
// 6 mno
// 7 pqrs
// 8 tuv
// 9 wxyz

//leetcode submit region begin(Prohibit modification and deletion)
func letterCombinations(digits string) []string {
	var result []string
	m := map[rune][]rune{
		'2': []rune{'a', 'b', 'c'},
		'3': []rune{'d', 'e', 'f'},
		'4': []rune{'g', 'h', 'i'},
		'5': []rune{'j', 'k', 'l'},
		'6': []rune{'m', 'n', 'o'},
		'7': []rune{'p', 'q', 'r', 's'},
		'8': []rune{'t', 'u', 'v'},
		'9': []rune{'w', 'x', 'y', 'z'},
	}

	var tmp [][]rune
	for _, num := range digits {
		tmp = append(tmp, m[num])
	}
	if len(tmp) == 0 {
		return result
	}
	for _, first := range tmp[0] {
		if len(tmp) == 1 {
			result = append(result, string([]rune{first}))
		} else {
			for _, second := range tmp[1] {
				if len(tmp) == 2 {
					result = append(result, string([]rune{first, second}))
				} else {
					for _, third := range tmp[2] {
						if len(tmp) == 3 {
							result = append(result, string([]rune{first, second, third}))
						} else {
							for _, fourth := range tmp[3] {
								result = append(result, string([]rune{first, second, third, fourth}))
							}
						}
					}
				}
			}
		}
	}
	return result
}
//leetcode submit region end(Prohibit modification and deletion)

